#include <zmq.hpp>
#include <iostream>
#include <string>
#include <thread>
#include <chrono>

int main() {
    // 创建上下文
    zmq::context_t context(1);
    
    // 创建PUSH套接字
    zmq::socket_t distributor(context, ZMQ_PUSH);
    
    // 绑定到接口
    distributor.bind("tcp://*:5555");
    
    std::cout << "Task distributor started on port 5555" << std::endl;
    
    // 模拟任务队列
    std::vector<std::string> tasks = {
        "Task 1", "Task 2", "Task 3", "Task 4", "Task 5",
        "Task 6", "Task 7", "Task 8", "Task 9", "Task 10"
    };
    
    // 等待工作者连接
    std::cout << "Waiting for workers to connect..." << std::endl;
    std::this_thread::sleep_for(std::chrono::seconds(1));
    
    // 分发任务
    for (const auto& task : tasks) {
        zmq::message_t msg(task.begin(), task.end());
        distributor.send(msg, zmq::send_flags::none);
        std::cout << "Sent: " << task << std::endl;
        std::this_thread::sleep_for(std::chrono::milliseconds(100));
    }
    
    // 发送结束信号
    for (int i = 0; i < 3; ++i) {
        zmq::message_t msg("END", 3);
        distributor.send(msg, zmq::send_flags::none);
    }
    
    return 0;
}


// ZeroMQ的PUSH/PULL模式实现了内置的负载均衡机制：

// 公平队列分发：PUSH套接字会将消息按轮询方式分配给所有连接的PULL套接字
// 动态负载调整：当新的工作者连接或断开时，系统会自动调整分发策略
// 消息原子性：确保消息不会被重复处理或丢失